package com.sptpc.demo.controller;


import com.sptpc.demo.controller.requests.AddDrinkRequest;
import com.sptpc.demo.controller.requests.ModifyDrinkRequest;
import com.sptpc.demo.model.Drink;
import com.sptpc.demo.repository.DrinkRepository;
import com.sptpc.demo.service.IDrinkService;
import lombok.extern.slf4j.Slf4j;
import org.joda.money.CurrencyUnit;
import org.joda.money.Money;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.http.MediaType;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.validation.Valid;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

@Slf4j
@RestController
@RequestMapping("/drink")
public class DrinkController {
    @Autowired
private IDrinkService drinkService;

//    查询所有
//get  /drink/
//    @RequestMapping(value = "/",method = RequestMethod.GET)
    @GetMapping("/")
    public List<Drink> getAll(Integer page,Integer limit){
        //mock数据 - 后期使用数据库查询
        PageRequest pageRequest=PageRequest.of(page-1,limit);
        List<Drink> results=drinkService.getAllDrinks(pageRequest).getContent();
        return results;
    }

    /* 查询单个
       日志
       get  /drink/1
       path路径表示方法 id=1
     */
    @GetMapping("/{id}")
    public Drink getDrink(@PathVariable Integer id){
        log.info("查询饮品的id: {}", id);
        //    后期使用数据库查询
        // select .... where id = $id
        Drink drink=Drink.builder().id(1)
                .name("茉莉花茶")
                .price(Money.parse("USD 8.00"))
                .build();
        return drink;
    }
    /*新增
      post /drink/ {"name“: "奶茶", "price": 8.00}
      1.直接使用model类接收用户参数
      2.编写一个TO类专门负责传值
    */
    @PostMapping("/")
    public Drink addNewDrink(@RequestBody @Valid AddDrinkRequest drink,
                             BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            for (ObjectError error : bindingResult.getAllErrors()) {
                log.error(error.toString());
            }
            return null;
        } else {
            log.info("创建新饮品: {}", drink);
            //后期使用数据库insert
            Drink saveDrink=new Drink();
            BeanUtils.copyProperties(drink,saveDrink);

            drinkService.addNewDrink(saveDrink,drink.getCategoryId());
            return saveDrink;
        }
    }
    /*
      修改
       put /drink/ {"id“:1 "name": "新奶茶", "price":10.00}
     */
    @PutMapping("/")
    public Drink modifyDrink(@RequestBody ModifyDrinkRequest request){
        log.info("要修改的饮品: {}", request);
        //后期使用数据库update
        //1.通过查询id出饮品
        Drink drink= drinkService.getDrinkById(request.getId());
//        if (request.getName()!=null && !request.getName().equals("")){
//
//        }
        //2.复制前端要修改的数据库
        BeanUtils.copyProperties(request,drink);
        // 3.更新数据库
        drinkService.updateDrink(drink);
        return drink;
    }

  /*
   删除
   delete /drink/1
  */
    @DeleteMapping("/{id}")
    public String deleteDrink(@PathVariable Integer id){
        log.info("要删除的饮品的id: {}",id);
        drinkService.deleteDrinkById(id);
        return "删除成功";
    }


    //    文件上传
   //    前端类型必须设置为multipart/form-data
   //    前段必须使用html form
    @PostMapping(value = "/upload",
            consumes ={MediaType.MULTIPART_FORM_DATA_VALUE})
     public String uploadFile(MultipartFile file){
        String dest="D:/upload/";
        String destFileName=dest+ file.getOriginalFilename();
        File destFile=new File(destFileName);
        try {
            file.transferTo(destFile);
        } catch (IOException e) {
            e.printStackTrace();
            return "上传失败";
        }
        return "上传成功";
    }


    @PostMapping(value = "/batch",
            consumes ={MediaType.MULTIPART_FORM_DATA_VALUE})
    public List<Drink> batchAddNewDrink(MultipartFile file){
        List<Drink> results=new ArrayList<>();
        try {
            BufferedReader reader=new BufferedReader(new InputStreamReader(
                    file.getInputStream()));
            String line="";
            while ((line=reader.readLine())!=null) {
                //解析一行
                String[] args=line.split(",");
                Drink drink=Drink.builder()
                        .id(Integer.parseInt(args[0]))
                        .name(args[1])
                        .price(Money.of(CurrencyUnit.of("CNY"),Double.parseDouble(args[2])))
                        .build();
                results.add(drink);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return results;
    }
}
